<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>线性结构-优先级队列封装</title>
</head>

<body>
  <script>
    // 封装优先级队列类
    function PriorityQueue() {
      // 在PriorityQueue类中再创建一个内部类
      // 用于再次封装数据的优先级
      function QueueElement(element, priority) {
        this.element = element
        this.priority = priority
      }
      // 封装属性
      this.items = []
      // 1实现插入方法
      PriorityQueue.prototype.enqueue = function (element, priority) {
        // 1.1实例化QueueElement对象
        const queueElement = new QueueElement(element, priority)
        // 1.2判断队列是否为空
        if (this.items.length == 0) {
          this.items.push(queueElement)
        } else {
          let added = false
          for (let i = 0; i < this.items.length; i++) {
            if (queueElement.priority < this.items[i].priority) {
              this.items.splice(i, 0, queueElement)
              added = true
              break
            }
          }
          if (!added) {
            this.items.push(queueElement)
          }
        }
      }
      // 2.从队列中删除前端元素
      PriorityQueue.prototype.dequeue = function () {
        return this.items.shift()
      }
      // 3.查看前端的元素
      PriorityQueue.prototype.front = function () {
        return this.items[0]
      }
      // 4.查看队列是否为空
      PriorityQueue.prototype.isEmpty = function () {
        return this.items.length == 0
      }
      // 5.查看队列中元素的个数
      PriorityQueue.prototype.size = function () {
        return this.items.length
      }
      // 6.toString方法
      PriorityQueue.prototype.toString = function () {
        let string = ''
        for (let i = 0; i < this.items.length; i++) {
          string += this.items[i] + '--'
        }
        return string
      }
    }
    const pq = new PriorityQueue()
    pq.enqueue('a',100)
    pq.enqueue('b',200)
    pq.enqueue('c',50)
    pq.enqueue('d',10)
    console.log(pq)
  </script>
</body>

</html>